package framework.forms;

import java.util.HashMap;

import org.openqa.selenium.By;

import framework.BaseForm;
import framework.elements.Button;
import framework.elements.Label;
import framework.elements.Link;
import framework.elements.TextBox;

/**
 * Форма логина
 */
public class LoginForm extends BaseForm{

	private TextBox uName = new TextBox(By.name("username"), "Снилс");
	private TextBox uPass = new TextBox(By.name("password"), "Пароль");
	private Button joinBtn = new Button(By.xpath("//button[@value='Войти']"), "Войти");
	private Link urFaces = new Link(By.xpath("//a[contains(.,'Юридические лица')]"), "Юридические лица");
	private final Label selectOrgLbl = new Label(By.xpath("//div[contains(.,'Название организации')]"),"Выбор организации");

	/** Базовый конструктор.
	 */
	protected LoginForm() {
		super(By.xpath("//*[contains(@name,'username') or contains(@name,'login')]"), "Логиновая страница");
	}

	/** Заполняет форму логина
	 * @param login логин
	 * @param password пароль
	 */
	private void fillLoginForm(final String login, final String password){
		urFaces.click();
		uName.setText(login);
		uPass.click();
		uPass.setText(password);
		joinBtn.clickThrowException();
	}

	/** Осуществляет логин
	 * @return форма личного кабинета
	 */
	public final MyCabinetForm login(){
		/*String appVersion = BaseForm.getVersion();
		new DataBaseUtils().removeDupeUserAndSetPerm(appVersion, fullname, userLogin);*/
		if(uName.isPresent()){
			fillLoginForm(System.getProperty(LOGIN), System.getProperty(PASSWORD));
		}else{
			SimulatorLoginForm slf = new SimulatorLoginForm();
			slf.login(System.getProperty(LOGIN), System.getProperty(PASSWORD));
		}
		return new MyCabinetForm();
	}

	/** Вход в личный кабинет
	 * @param login логин для входа
	 * @return форма личного кабинета
	 */
	public final MyCabinetForm login(String login){
		initializeLogin(login);
		if(uName.isPresent()){
			fillLoginForm(login, System.getProperty(PASSWORD));
		}else{
			SimulatorLoginForm slf = new SimulatorLoginForm();
			slf.login(login, System.getProperty(PASSWORD));
		}
		return new MyCabinetForm();
	}

/*	*//** Логин как пользователь, загружающий XML
	 * @return форма личного кабинета
	 *//*
	public final MyCabinetForm loginAsXmlLoader(){
		if(uName.isPresent()){
			fillLoginForm(System.getProperty(LOGIN_LOADER), System.getProperty(PASS_LOADER));
		}else{
			SimulatorLoginForm slf = new SimulatorLoginForm();
			slf.login(System.getProperty(LOGIN_LOADER), System.getProperty(PASS_LOADER));
		}
		return new MyCabinetForm();
	}*/

	/** Логин как пользователь новосозданной организации
	 * @return форма личного кабинета
	 */
	public final MyCabinetForm loginAsUser1(){
		if(uName.isPresent()){
			fillLoginForm(System.getProperty(LOGIN_UNREG_ORG), System.getProperty(PASSWORD));
		}else{
			SimulatorLoginForm slf = new SimulatorLoginForm();
			slf.login(System.getProperty(LOGIN_UNREG_ORG), System.getProperty(PASSWORD));
		}
		return new MyCabinetForm();
	}

	/** Логирование как пользователь незарегестрированной организации
	 * @return форма регистрации организации
	 */
	public final OrganizationRegisterForm loginAsNotRegister(){
		if(uName.isPresent()){
			fillLoginForm(System.getProperty(LOGIN_UNREG_ORG), System.getProperty(PASSWORD));
		}else{
			SimulatorLoginForm slf = new SimulatorLoginForm();
			initializeLogin(System.getProperty(LOGIN_UNREG_ORG));
			browser.navigate("https://fz02.lanit.ru/223/ppa/private/login.html");
			slf.loginAsNewUser(System.getProperty(LOGIN_UNREG_ORG),
					getLoginData(LOGIN_ITEMS.LAST_NAME),
					getLoginData(LOGIN_ITEMS.FIRST_NAME),
					getLoginData(LOGIN_ITEMS.SECOND_NAME),
					getLoginData(LOGIN_ITEMS.USER_POSITION),
					getLoginData(LOGIN_ITEMS.SNILS),
					getLoginData(LOGIN_ITEMS.KPP),
					getLoginData(LOGIN_ITEMS.ESIA_ID),
					getLoginData(LOGIN_ITEMS.EMAIL),
					getLoginData(LOGIN_ITEMS.USER_AUTHORITY),
					getLoginData(LOGIN_ITEMS.ORG_FULL_NAME),
					getLoginData(LOGIN_ITEMS.ORG_SHORT_NAME),
					getLoginData(LOGIN_ITEMS.OGRN),
					getLoginData(LOGIN_ITEMS.INN),
					getLoginData(LOGIN_ITEMS.KPP),
					getLoginData(LOGIN_ITEMS.ORG_ADDRESS));
		}
		return new OrganizationRegisterForm();
	}

	/** Осуществляет логин как незарегистрированный пользователь
	 * @param orgName наименование организации
	 * @return форма регистрации пользователя/организации
	 */
	public final OrganizationRegisterForm loginAsUnregisterUser(String orgName){
		if(uName.isPresent()){
			fillLoginForm(System.getProperty(LOGIN_UNREGISTER_USER), System.getProperty(PASSWORD));
			SelectOrgForm selectOrg = new SelectOrgForm();
			selectOrg.selectOrg(orgName);
		}else{
			SimulatorLoginForm slf = new SimulatorLoginForm();
			initializeLogin(System.getProperty(LOGIN_UNREGISTER_USER));
			slf.loginAsNewUser(System.getProperty(LOGIN_UNREGISTER_USER),
					getLoginData(LOGIN_ITEMS.LAST_NAME),
					getLoginData(LOGIN_ITEMS.FIRST_NAME),
					getLoginData(LOGIN_ITEMS.SECOND_NAME),
					getLoginData(LOGIN_ITEMS.USER_POSITION),
					getLoginData(LOGIN_ITEMS.SNILS),
					getLoginData(LOGIN_ITEMS.KPP),
					getLoginData(LOGIN_ITEMS.ESIA_ID),
					getLoginData(LOGIN_ITEMS.EMAIL),
					getLoginData(LOGIN_ITEMS.USER_AUTHORITY),
					getLoginData(LOGIN_ITEMS.ORG_FULL_NAME),
					getLoginData(LOGIN_ITEMS.ORG_SHORT_NAME),
					getLoginData(LOGIN_ITEMS.OGRN),
					getLoginData(LOGIN_ITEMS.INN),
					getLoginData(LOGIN_ITEMS.KPP),
					getLoginData(LOGIN_ITEMS.ORG_ADDRESS));
			// При регистрации через симулятор, я не уверен что должно появится следующее окно
			if(selectOrgLbl.isPresent()){
				SelectOrgForm selectOrg = new SelectOrgForm();
				selectOrg.selectOrg(orgName);
			}
		}
		return new OrganizationRegisterForm();
	}

	/** Перечень полей Протокола вскрытия конвертов
	 */
	public static enum LOGIN_ITEMS{

		// Организация, подавшая первую заявку:
		LAST_NAME("Фамилия"), FIRST_NAME("Имя"), SECOND_NAME("Отчество"), USER_FULL_NAME("ФИО пользователя"),
		USER_POSITION("Позиция пользователя"), USER_POST("Должность пользователя"), SNILS("Снилс"), ESIA_ID("ЕСИА Id"),
		EMAIL("Email"), USER_AUTHORITY("authority"), ORG_FULL_NAME("Полное наименование организации"),
		ORG_SHORT_NAME("Сокращенное наименование организации"), OGRN("ОГРН"), INN("ИНН"), KPP("КПП"),
		ORG_ADDRESS("Адрес организации"), ORG_OWNER("Полномочия организации");

		private String val;

		/** Устанавливает название элементу перечисления
		 * @param name название
		 */
		LOGIN_ITEMS(String name) {
			val = name;
		}

		@Override
		public String toString() {
			return val;
		}
	}

	private static HashMap<String, String> loginFields = new HashMap<String, String>();

	/** Устанавливает значение для поля заявки
	 * @param item поле
	 * @param value значение
	 */
	private static void setLoginData(LOGIN_ITEMS item, String value){
		logger.info(item.toString() + " инициализируется значением: " + value);
		loginFields.put(item.toString(), value);
	}

	/** Возвращает значение поля заявки
	 * @param item поле
	 * @return значение
	 */
	public static String getLoginData(LOGIN_ITEMS item){
		String value = loginFields.get(item.toString());
		logger.info(item.toString() + " содержит значение: " + value);
		return value;
	}


	/** Инициализирует данные для регистрации организации или пользователя
	 * @param login логин пользователя
	 */
	public static void initializeLogin(String login){
		setLoginData(LOGIN_ITEMS.EMAIL, "testmailfz223@gmail.com");
		setLoginData(LOGIN_ITEMS.ORG_SHORT_NAME, "");
		setLoginData(LOGIN_ITEMS.ORG_OWNER, "Заказчик");
		if(login.equals("223-223-223 81")){
			setLoginData(LOGIN_ITEMS.LAST_NAME, "Майкин-Автотест");
			setLoginData(LOGIN_ITEMS.FIRST_NAME, "Сергей");
			setLoginData(LOGIN_ITEMS.SECOND_NAME, "Иванович");
			setLoginData(LOGIN_ITEMS.USER_FULL_NAME, "Майкин-Автотест" + " " + "Сергей" + " " + "Иванович");
			setLoginData(LOGIN_ITEMS.USER_POSITION, "Дополнительный администратор по автоматизации");
			setLoginData(LOGIN_ITEMS.USER_POST, "Администратор организации");
			setLoginData(LOGIN_ITEMS.SNILS, "223-223-223 81");
			setLoginData(LOGIN_ITEMS.KPP, "444444480");
			setLoginData(LOGIN_ITEMS.ESIA_ID, "22322322381");
			setLoginData(LOGIN_ITEMS.INN, "4444444480");
			setLoginData(LOGIN_ITEMS.USER_AUTHORITY, "Администратор профиля организации");
			setLoginData(LOGIN_ITEMS.ORG_FULL_NAME, "Тестовая организация \"ОАО Автоматизация 01\"");
			setLoginData(LOGIN_ITEMS.ORG_ADDRESS, "423600, Татарстан Респ, Елабуга г, Набережная ул, д. 80");
			setLoginData(LOGIN_ITEMS.OGRN, "9999999999980");
		}else if(login.equals("223-223-223 93")){
			setLoginData(LOGIN_ITEMS.LAST_NAME, "MY_Автотестин");
			setLoginData(LOGIN_ITEMS.FIRST_NAME, "MY_Иван");
			setLoginData(LOGIN_ITEMS.SECOND_NAME, "MY_Семенович");
			setLoginData(LOGIN_ITEMS.USER_FULL_NAME, "MY_Автотестин" + " " + "MY_Иван" + " " + "MY_Семенович");
			setLoginData(LOGIN_ITEMS.USER_POSITION, "Администратор организации по автоматизации");
			setLoginData(LOGIN_ITEMS.USER_POST, "Администратор организации");
			setLoginData(LOGIN_ITEMS.SNILS, "223-223-223 93");
			setLoginData(LOGIN_ITEMS.KPP, "444444493");
			setLoginData(LOGIN_ITEMS.ESIA_ID, "22322322393");
			setLoginData(LOGIN_ITEMS.INN, "4444444493");
			setLoginData(LOGIN_ITEMS.USER_AUTHORITY, "Администратор профиля организации");
			setLoginData(LOGIN_ITEMS.ORG_FULL_NAME, "MY_Testova9 Organizazi9 \"T4UP AUTO 01\"");
			setLoginData(LOGIN_ITEMS.ORG_ADDRESS, "Российская Федерация, 142100, Московская обл, Подольск г, Ватутинский проезд, д. 85");
			setLoginData(LOGIN_ITEMS.OGRN, "9999999999993");
		}
		else if(login.equals("223-223-223 87")){
			setLoginData(LOGIN_ITEMS.LAST_NAME, "Лоскутков-Автотест");
			setLoginData(LOGIN_ITEMS.FIRST_NAME, "Иван");
			setLoginData(LOGIN_ITEMS.SECOND_NAME, "Семенович");
			setLoginData(LOGIN_ITEMS.USER_FULL_NAME, "Лоскутков-Автотест" + " " + "Иван" + " " + "Семенович");
			setLoginData(LOGIN_ITEMS.USER_POSITION, "Уполномоченный специалист по автоматизации");
			setLoginData(LOGIN_ITEMS.USER_POST, "Администратор организации");
			setLoginData(LOGIN_ITEMS.SNILS, "223-223-223 87");
			setLoginData(LOGIN_ITEMS.KPP, "444444485");
			setLoginData(LOGIN_ITEMS.ESIA_ID, "22322322387");
			setLoginData(LOGIN_ITEMS.INN, "4444444485");
			setLoginData(LOGIN_ITEMS.USER_AUTHORITY, "Уполномоченный специалист организации");
			setLoginData(LOGIN_ITEMS.ORG_FULL_NAME, "Тестовая организация \"ОАО Автоматизация 02\"");
			setLoginData(LOGIN_ITEMS.ORG_ADDRESS, "Российская Федерация, 142100, Московская обл, Подольск г, Ватутинский проезд, д. 85");
			setLoginData(LOGIN_ITEMS.OGRN, "9999999999985");
		}else if(login.equals("223-223-223 86")){
			setLoginData(LOGIN_ITEMS.LAST_NAME, "Говорков-Автотест");
			setLoginData(LOGIN_ITEMS.FIRST_NAME, "Иван");
			setLoginData(LOGIN_ITEMS.SECOND_NAME, "Иванович");
			setLoginData(LOGIN_ITEMS.USER_FULL_NAME, "Говорков-Автотест" + " " + "Иван" + " " + "Иванович");
			setLoginData(LOGIN_ITEMS.USER_POSITION, "Дополнительный администратор по автоматизации");
			setLoginData(LOGIN_ITEMS.USER_POST, "Администратор организации");
			setLoginData(LOGIN_ITEMS.SNILS, "223-223-223 86");
			setLoginData(LOGIN_ITEMS.KPP, "444444485");
			setLoginData(LOGIN_ITEMS.ESIA_ID, "22322322386");
			setLoginData(LOGIN_ITEMS.INN, "4444444485");
			setLoginData(LOGIN_ITEMS.USER_AUTHORITY, "Администратор профиля организации");
			setLoginData(LOGIN_ITEMS.ORG_FULL_NAME, "Тестовая организация \"ОАО Автоматизация 02\"");
			setLoginData(LOGIN_ITEMS.ORG_ADDRESS, "Российская Федерация, 142100, Московская обл, Подольск г, Ватутинский проезд, д. 85");
			setLoginData(LOGIN_ITEMS.OGRN, "9999999999985");
		}else if(login.equals("223-223-223 90")){
			setLoginData(LOGIN_ITEMS.LAST_NAME, "Иванов-Автотест");
			setLoginData(LOGIN_ITEMS.FIRST_NAME, "Олег");
			setLoginData(LOGIN_ITEMS.SECOND_NAME, "Петрович");
			setLoginData(LOGIN_ITEMS.USER_FULL_NAME, "Иванов-Автотест" + " " + "Олег" + " " + "Петрович");
			setLoginData(LOGIN_ITEMS.USER_POSITION, "Дополнительный администратор по автоматизации");
			setLoginData(LOGIN_ITEMS.USER_POST, "Генеральный директор");
			setLoginData(LOGIN_ITEMS.SNILS, "223-223-223 90");
			setLoginData(LOGIN_ITEMS.KPP, "444444490");
			setLoginData(LOGIN_ITEMS.ESIA_ID, "22322322390");
			setLoginData(LOGIN_ITEMS.INN, "4444444490");
			setLoginData(LOGIN_ITEMS.USER_AUTHORITY, "Администратор профиля организации");
			setLoginData(LOGIN_ITEMS.ORG_FULL_NAME, "Тестовая организация \"ОАО Автоматизация 03\"");
			setLoginData(LOGIN_ITEMS.ORG_ADDRESS, "142100, Московская обл,, Подольск г, Ватутинский проезд, дом 85");
			setLoginData(LOGIN_ITEMS.OGRN, "9999999999990");
		}else if(login.equals("223-223-223 10")){
			setLoginData(LOGIN_ITEMS.EMAIL, "pgz223fz@yandex.ru");
			setLoginData(LOGIN_ITEMS.LAST_NAME, "Юрьев-Тест");
			setLoginData(LOGIN_ITEMS.FIRST_NAME, "Семен");
			setLoginData(LOGIN_ITEMS.SECOND_NAME, "Петрович");
			setLoginData(LOGIN_ITEMS.USER_FULL_NAME, "Юрьев-Тест" + " " + "Семен" + " " + "Петрович");
			setLoginData(LOGIN_ITEMS.USER_POSITION, "Дополнительный администратор по автоматизации");
			setLoginData(LOGIN_ITEMS.USER_POST, "Администратор организации");
			setLoginData(LOGIN_ITEMS.SNILS, "223-223-223 90");
			setLoginData(LOGIN_ITEMS.KPP, "444444442");
			setLoginData(LOGIN_ITEMS.ESIA_ID, "22322322310");
			setLoginData(LOGIN_ITEMS.INN, "4444444442");
			setLoginData(LOGIN_ITEMS.USER_AUTHORITY, "Администратор профиля организации");
			setLoginData(LOGIN_ITEMS.ORG_FULL_NAME, "Тестовая организация 3");
			setLoginData(LOGIN_ITEMS.ORG_ADDRESS, "423600, Татарстан Респ, Елабуга г, Набережная ул, 1");
			setLoginData(LOGIN_ITEMS.OGRN, "9999999999992");
		}else{
			logger.error("Данные для регистрации логина " + login + " отсутствуют.");
		}
	}
}
